Глава 18

Протоколы для работы с удаленными серверами

В главе 17 мы уже познакомились с управлением файловой системой на локальном сервере. Однако возможности ColdFusion по работе с файлами на этом не заканчиваются. Как известно, для Internet/intranet существуют различные протоколы, позволяющие передавать и принимать с удаленных серверов необходимую информацию. ColdFusion в этом плане поддерживает следующие протоколы: HTTP (HyperText Transfer Protocol), FTP (File Transfer Protocol) и LDAP (Lightweight Directory Access Protocol). Одно из немаловажных преимуществ заключается в том, что перечисленные протоколы предоставляют пользователю возможность передавать файлы между двумя компьютерами на базе различных платформ.

Протокол передачи гипертекста

HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) является протоколом высокого уровня (а именно, уровня приложений), обеспечивающий необходимую скорость передачи данных, требующуюся для распределенных информационных систем. Ярким примером служит World Wide Web (WWW). HTTP-протокол может использоваться во многих задачах, таких как серверы имен и распределенные системы управления объектами, посредством расширения методов запроса. В ColdFusion применение HTTP-протокола для доступа к документам, расположенным на Web-сервере, происходит за счет использования тегов <CFHTTP> и <CFHTTPPARAM>.

Тег <CFHTTP>

<CFHTTP URL = "hostname"

PORT = "port_number" METHOD = "Get | Post" USERNAME = "username"

PASSWORD = "password" NAME = "queryname" COLUMNS = "query_columns"

PATH = "path" FILE = "filename" DELIMITER = "character"

TEXTQUALIFIER = "character" RESOLVEURL = "Yes | No"

PROXYSERVER = "hostname" PROXYPORT = "port_number"

USERAGENT = "user_agent" THROWONERROR = "Yes | No"

REDIRECT = "Yes | No" TIMEOUT = "timeout_period"> </CFHTTP>

В табл. 18.1 представлено описание атрибутов тега <CFHTTP>.

Таблица 18.1. Описание атрибутов тега <CFHTTP>

Атрибут

Описание

URL

Полный путь к ресурсу, включая название протокола HTTP или HTTPS. Обязательный атрибут

PORT

Номер порта. По умолчанию 80. Обязательный атрибут

METHOD

Метод работы. Возможные значения:

• Get — позволяет получать текстовые файлы или разгружать (download) бинарные файлы;

• Post — позволяет посылать информации к странице сервера или CGI-программе для обработки. Данный метод предполагает использование тега <CFHTTPPARAM>.

Обязательный атрибут

USERNAME

• Имя пользователя. Атрибут, необходимый при аутентификации на сервере

PASSWORD

Пароль пользователя. Атрибут, необходимый при аутентификации на сервере

NAME

Имя запроса при получении файла. Необязательный атрибут

COLUMNS

Список колонок запроса, разделенных запятой. Применяется для извлечения данных из текстового файла, используя метод Get. При этом извлечение данных происходит, начиная со второй строки, а первая строка текстового файла воспринимается как заголовок. Указание данного атрибута подразумевает переопределение имен колонок запроса, по умолчанию принимающих значения заголовка текстового файла. Необязательный атрибут

 

Атрибут

Описание

PATH

Путь к каталогу, куда должен быть помещен файл, указанный с использованием атрибута FILE. Необязательный атрибут .

FILE

Имя файла. Требуется при использовании метода Post, если указывается атрибут PATH. Впрочем, при указании PATH атрибут FILE также может быть использован с методом Get, если существует необходимость размещения файла с именем, отличным от того, к которому происходит обращение с помощью атрибута URL

DELIMITER

Разделитель, используемый для создания запроса. По умолчанию — запятая. Необязательный атрибут

TEXTQUALIFIER

Квалификатор, определяющий начало и конец колонки для формирования запроса. По умолчанию — двойные кавычки. Необязательный атрибут

RESOLVEURL

Индикатор поддержки ссылок. Положительное значение данного1 атрибута позволяет в переменную FileContent (содержимое файла) помимо самого содержимого документа включить номер порта, так чтобы связи остались неповрежденными. Возможные значения:

• Yes— да; • NO — нет (по умолчанию). Необязательный атрибут

PROXYSERVER

Наименование хоста или IP-адрес proxy-сервера. Необязательный атрибут

PROXYPORT

Номер порта proxy-сервера. По умолчанию — 80. Необязательный атрибут

USERAGENT

Пользовательский агент запрашиваемых заголовков. Необязательный атрибут

THROWONERROR

Индикатор контроля ошибок. Указывает на возможность вызова исключительной ситуации, которая может быть обработана с помощью предназначенных для этой цели тегов <CFTRY> и <CFCATCH>. Допустимые значения:

• Yes— да; • No — нет (по умолчанию). Необязательный атрибут

TIMEOUT

Возможные значения:

• Yes — да (по умолчанию);

• NO — нет.

Необязательный атрибут

Период ожидания для соединения с Web-сервером. Определяется в секундах. Необязательный атрибут

REDIRECT

Индикатор переадресации. Указывает, совершать ли переадресацию выполнения или сделать остановку в непредвиденной ситуации. ColdFusion поддерживает до пяти переадресаций.

При использовании тега <CFHTTP> создается объект cfhttp, обеспечивающий доступ к вспомогательной информации, посредством следующих переменных:

Тег <CFHTTPPARAM>

Синтаксис:

<CFHTTPPARAM NAME = "name" TYPE = "type"

VALUE = "transaction type" FILE = "filename">

В табл. 18.2 представлено описание атрибутов тега <CFHTTPPARAM>.

Таблица 18.2. Описание атрибутов тега <CFHTTPPARAM>

Атрибут

Описание

VALUE FILE

Значение передаваемой переменной. Необязательный атрибут для типа File

Полное имя файла, включая путь. Обязательный атрибут для типа File

TYPE

Тип передаваемой переменной. Возможные значения:

  • URL — переменная URL;
  • FormField — поле формы;
  • Cookie — переменная cookies;
  • CGI — переменная окружения CGI;
  • File — файл. Обязательный атрибут

NAME

Имя передаваемой переменной. Обязательный атрибут

 

Примеры работы с удаленным сервером через HTTP-протокол

Предположим, что нам- необходимо получить содержимое страницы login.cfm, находящейся на Web-сервере ipweb в подкаталоге mail. Для решения данной задачи мы воспользуемся тегом <CFHTTP> и методом Get:

<CFHTTP METHOD = "Get"

URL = "http://ipweb/mail/login.cfm"

RESOLVEURL - "Yes"> <CFOUTPUT>#cfhttp.FileContent#</CFOUTPUT>

Здесь указан атрибут RESOLVEURL, который, как уже было отмечено в описании тега <CFHTTP>, позволяет в переменную FileContent (содержимое файла) помимо самого содержимого документа включить номер порта, так чтобы связи остались неповрежденными. Затем на экран выводится содержимое полученной страницы с использованием все той же внутренней переменной FileContent.

Еще один пример с применением метода Get позволяет сохранять полученный документ на сервере ColdFusion:

<CFHTTP METHOD = "Get"

URL = "http://ipweb/mail/login.cfm"

PATH = "c:\Apache\htdoc3\my-app\" FILE = "login.html"

USERNAME = "IUSR_IPWEB" PASSWORD = "****">

<CFOUTPUT>#cfhttp.StatusCodet</CFOUTPUT>

где атрибут PATH устанавливает путь к каталогу сервера ColdFusion, в который должен быть помещен документ с именем, указанным с помощью атрибута FTLE. При этом используются необязательные атрибуты USERNAME и PASSWORD, позволяющие идентифицировать соединение с удаленным сервером. Здесь же мы выводим на экран состояние выполнения тега <CFHTTP> с помощью переменной statuscode, что позволяет удостовериться в успешном выполнении кода при значении этой переменной, равном "200 Success".

Тег <CFHTTP> также позволяет создавать запросы, используя текстовые файлы, отредактированные по определенному правилу:

В качестве примера создадим файл TestDataSources.txt (листинг 18.1), который будет являться источником для запроса. Обращаем ваше внимание, что данные перечисляются через точку с запятой (;), о чем в последствии надо не забыть.

Листинг 18,1. Текстовый файл TestDataSources.txt

"А";"В";"С"

"Mark";"Portugal";"1962-10-30" "Mike";"Stanley";"1963-06-25"

"Noman";"Garciaparra";"1973-07-23" "Pat";"Rapp";"1967-07-13"

"Pedro";"Martinez";"1971-10-25"

Теперь, когда источник данных существует в форме текстового файла, сформируем код страницы, позволяющей создавать запрос на основе

имеющихся данных и отражать эти данные в окне обозревателя в виде таблицы, как показано в листинге 18.2.

Листинг 18.2. Код страницы MyCFHttp.cfm

<HTML> <HEAD>

<TITLE>CFHTTP</TITLE> </HEAD> <BODY>

<CFHTTP METHOD = "Get"

URL = "http://ipweb/TestDateSources.txt"

NAME = "MyCFHttp" COLUMNS = "FName,LName,BDay" DELIMITER = ";">

<TABLE cellpadding="0" cellspacing="8"> <TR>

<TDXb>FirstName</b></TD> <TDXb>LastName</b></TD>

<TD><b>Birthday</b></TD> </TR>

<TR><TD bgcolor="123456" colspan="3" height=l></TD></TR>

<CFOUTPUT QUERY="MyCFHttp"> <TR>

<TD>#FNamel</TD><TD>#LNamett</TD>

<TD>#BDay#</TD> </TR>

</CFOUTPUT> </TABLE>

</BODY> </HTML>

Если бы в текстовом файле данные были записаны через запятую, то атрибут DELIMITER можно было бы не использовать. Атрибут COLUMNS также можно не указывать, но в таком случае в качестве имен переменных необходимо учитывать значения колонок из первой строки текстового файла, так называемый заголовок данных. Для нашего примера это А, в и с,

Все предыдущие примеры использования тега <CFHTTP> основывались на методе Get. Теперь приведем пример с применением метода Post, позволяющего отправлять данные странице сервера или CGI-программе для обработки. Такой метод предполагает использование тега <CFHTTPPARAM>, синтаксис которого достаточно прост, ь чем уже можно было убедиться в данной главе.

Предположим, нам необходимо отправить два параметра для выполнения одной из страниц удаленного сервера. Пусть один из параметров является переменной URL, а в качестве второго параметра передается бинарный файл. В свою очередь первый параметр выступает в качестве содержания создаваемого текстового файла, а второй параметр предназначен для загрузки файла на удаленный сервер. При этом надо отдавать себе отчет, что на удаленной машине также должен быть установлен и запущен ColdFusion Server. Приведем пример кода, позволяющего решить поставленную задачу (листинг 18.3).

Листинг 18.3. Код страницы MyCFHttpPost.cfm

<HTML>

<HEAD>

<TITLE>CFHTTP</TITLE> </HEAD> <BODY>

<CFHTTP METHOD = "Post"

URL = "http://ipweb/cfipweb/test.cfm">

<CFHTTPPARAM TYPE = "URL" NAME = "City" VALUE = "NewYork">

<CFHTTPPARAM TYPE = "File"

NAME = "filePhoto"

FILE = "D:\MyPhoto\Harlem.gif">

</CFHTTP>

</BODY> </HTML>

Так как в качестве второго параметра мы отправляем файл, что следует из значения атрибута TYPE тега <CFHTTPPARAM>, то здесь же мы указываем расположение этого файла с помощью атрибута FILE того же тега <CFHTTPPARM>. В листинге 18.4 приведен пример страницы Test.cfm, в которую и передаются указанные параметры.

Листинг 18.4. Код страницы Test.cfm

<HTML> <HEAD>

<TITLE>Test</TITLE> </HEAD> <BODY>

<CFIF isDefined("URL.City")> <CFFILE ACTION="Write"

FIXE="C:\InetPub\wwwroot\city.txt" OUTPUT="#URL.City#"> </CFIF>

<CFIF isDefined("Form.filePhoto")> <CFFILE ACTION="Upload"

FILEFIELD="Form.filePhoto" DESTINATION="C:\InetPub\www.root\" NAMECONFLICT="Overwrite"> </CFIF>

</BODY> </HTML>

Совершаемые на этой странице действия подробно описаны в главе 17. Отметим только, что данный файл должен находиться на удаленном сервере ipweb (каталог C:\InetPub\wwwroot есть ни что иное, как приемник бинарного файла, находящийся на удаленном сервере ipweb), и доступ к переменной, определяющей переданный бинарный файл, осуществляется через приставку Form.

Протокол передачи файлов

Протокол FTP (File Transfer Protocol, протокол передачи файлов) является одиним из ранних протоколов в Internet и входит в его стандарты. Обмен данными по протоколу FTP проходит по TCP-каналу. Построен обмен по технологии "клиент-сервер". FTP-протокол дает возможность пользователям одного компьютера получать доступ к файловой системе другого компьютера и получать/передавать файлы между компьютерами.

Существует два способа организации доступа к файловой системе удаленного компьютера по FTP-протоколу: анонимный и авторизованный.

Анонимный доступ обеспечивается под видом специально выделенного пользователя, которого еще называют anonymous, с необязательным паролем, впрочем, правило "хорошего тона" - в качестве пароля использовать адрес электронной почты. При входе в систему с правами anonymous вы получаете доступ к специально выделенному для этих пользователей каталогу, который называется FTP-сервером.

Что касается авторизованного доступа, то на конкретной удаленной системе осуществлять подобный доступ имеют право только пользователи этой удаленной системы после прохождения авторизации. После входа в систему пользователь, как правило, получает доступ к своему домашнему каталогу и ко всем другим файловым ресурсам удаленной системы, к которым он имеет права на доступ. Доступ же к FTP-серверу в ColdFusion осуществляется с помощью тега <CFFTP>.

Прежде чем приводить синтаксис и описание тега <CFFTP>, необходимо оговорить некоторые нюансы. Тег <CFFTP> предполагается использовать в двух режимах, первый из которых позволяет открывать и закрывать доступ к файлам и каталогам на FTP-сервере, а второй предназначен для непосредственной работы с файловой системой на FTP-сервере в период установленного соединения. После инициализации соединения открытый канал может быть использован как для приема, так и для передачи данных.

Канал управления должен быть открыт при передаче данных между машинами. В случае его закрытия передача данных прекращается. Но не забывайте закрывать канал управления принудительно после совершения необходимых действий, т. к. FTP-протокол серьезно загружает каналы, соединяющие вас с другими сетями.

Тег <CFFTP> для открытия и закрытия соединения

Синтаксис:

<CFFTP ACTION = "Open | Close"

USERNAME = "name" PASSWORD = "password" SERVER = "server"

TIMEOUT = "timeout in seconds" PORT = "port"

CONNECTION = "name" PROXYSERVER = "proxyserver"

RETRYCOUNT = "number"

STOPONERROR = "Yes | No"

PASSIVE = "Yes I No">

В табл. 18.3 приведено описание атрибутов тега <CFFTP> (вариант 1).

Таблица 18.3. Описание атрибутов тега <CFFTP> (вариант 1)

Атрибут

Описание

ACTION

Действие. Возможные значения:

• Open — открытие сессии;

• Close — закрытие сессии. Обязательный атрибут

USERNAME

Имя пользователя. Обязательный атрибут для действия Open

PASSWORD

'Пароль пользователя. Обязательный атрибут для действия Open

SERVER

Наименование FTP-сервера. Обязательный атрибут для действия Open

TIMEOUT

Ожидаемый период времени для соединения с РТР-сервером. Определяется в секундах. По умолчанию равен 30 секундам. Необязательный атрибут

PORT

Номер порта FTP-сервера. По умолчанию равен 21. Необязательный атрибут

CONNECTION

Название соединения. При повторном применении тега <CFFTP> использует существующую связь. Необязательный атрибут

PROXYSERVER

Наименование proxy-сервера. Необязательный атрибут

RETRYCOUNT

Число повторных попыток до возникновения сообщения об ошибке. По умолчанию равен 1. Необязательный атрибут

STOPONERROR

Индикатор прерывания при возникновении ошибок. Возможные значения:

  • Yes — да (по умолчанию);
  • No — нет. Необязательный атрибут

PASSIVE

Индикатор пассивной работы. Возможные значения:

  • Yes— да;
  • No — нет (по умолчанию).

Необязательный атрибут

При использовании тега <CFFTP> с атрибутом STOPONERROR, равным NO, создается объект cfftp, предоставляющий вспомогательную информацию относительно работы FTP-сервера с помощью следующих переменных:

Тег <CFFTP> для управления файловой системы FTP-сервера

Синтаксис:

<CFFTP ACTION = "action" USERNAME = "name"

PASSWORD = "password"

NAME = "query_name"

SERVER = "server"

TIMEOUT = "timeout in seconds"

PORT = "port"

CONNECTION = "name"

ASCIIEXTENSIONLIST = "extensions"

TRANSFERMODE = "ASCII | Binary | Auto"

FAILIFEXISTS = "Yes | No"

DIRECTORY = "directory name"

LOCALFILE = "filename"

REMOTEFILE = "filename"

ITEM = "directory or file"

EXISTING = "file or directory name"

NEW = "file or directory name"

PROXYSERVER = "proxyserver"

RETRYCOUNT = "number"

STOPONERROR = "Yes | No"

PASSIVE = "Yes | No">

В табл. 18.4 представлено описание атрибутов тега <CFFTP> (вариант 2).

Таблица 18.4. Описание атрибутов тега <CFFTP> (вариант 2)

Атрибут

Описание

ACTION

NAME ASCIIEXTENSIO:

TRANS FERMODE FAILIFEXISTS

Действие, позволяющее управлять файловой системой.

Возможные значения:

  • • ListDir — создает объект запроса со списком каталогов и файлов текущего каталога;
  • • ChangeDir — изменяет текущий каталог;
  • CreateDir — создает каталог;
  • RemoveDi r — удаляет каталог;
  • GetFile — получает файл;
  • PutFile — помещает файл;
  • Rename — переименовывает файл или каталог;
  • Remove — удаляет файл;
  • GetCurrentDir — получает имя текущего каталога;
  • GetCurrentURL — закрывает сессию;
  • ExistsDir — выясняет существование каталога;
  • ExistsFile — выясняет существование файла;
  • Exists — выясняет существование объекта. Обязательный атрибут Имя запроса. Обязательный атрибут для действия ListDir
  • MLIST Список расширений файлов, которые передаются как ASCII-коды. По умолчанию принимает значение
  • txt ; htm; html ; cfm; cfml ; shtm; shtml; css;asp;asa при условии, что указан атрибут TRANS FERMODE=' Auto'. Необязательный атрибут
  • Способ передачи файлов. Обязательный атрибут для действий GetFile и PutFile. Возможные значения:
  • ASCII -ASCII-коды;
  • Binary — бинарный;
  • Auto — определяется автоматически

Определяет, будет ли игнорироваться действие GetFile, если такой файл уже существует. Возможные значения:

  • Yes — да (по умолчанию);
  • No — нет

 

Атрибут

Описание

DIRECTORY

LOCAL FILE REMOTEFILE ITEM

EXISTING NEW

Каталог, по отношению к которому производится действие. Обязательный атрибут для действий ChangeDir, CreateDir, ListDir И ExistsDir

Имя файла на локальной машине. Обязательный атрибут для действий GetFile и PutFile

Имя файла на удаленном FTP-сервере. Обязательный атрибут для действий GetFile, PutFile, ExistsFile

Определяет объект, файл или каталог для указанного действия. Обязательный атрибут для действий Exists и Remove

Текущее имя файла или каталога на удаленном сервере. Обязательный атрибут для действия Rename

Новое имя файла или каталога на удаленном сервере. Обязательный атрибут для действия Rename

При использовании тега <CFFTP> с действиями GetcurrentDir, GetcurrentuRL, ExistsDir, ExistsFile и Exists ColdFusion создает переменную cfftp.returnvalue, значение которой зависит от используемого действия. Приведем список возможных значений переменной cfftp.returnvalue в зависимости от применяемого действия:

Следует также отметить, что при действии ListDir тег <CFFTP> создает объект запроса, обеспечивающий доступ к вспомогательной информации через следующие переменные:

Пример реализации упрощенного FTP-клиента

В качестве примера рассмотрим создание собственного FTP-клиента, с одной стороны имеющего достаточно ограниченные возможности, но при этом позволяющего продемонстрировать принцип работы с уже описанным тегом <CFFTP>.

Любой FTP-сервер, прежде чем совершить какие-либо действия по отношению к файлам или каталогам, предполагает предварительное открытие доступа, где в качестве атрибутов регистрации необходимо использовать SERVER, USERNAME и PASSWORD. Поскольку наш FTP-клиент должен иметь возможность регистрации на разных FTP-серверах, необходимо использовать какой-либо источник со списком возможных соединений. Во всех предыдущих примерах для подобных целей мы использовали базу данных, здесь же для упрощения реализации данной задачи возьмем обычный текстовый файл с именем RegisrationFTP.txt. Причем помимо имени сервера, имени пользователя и пароля в данном файле регистрации будем хранить имя каталога на локальном сервере, который должен являться источником файлов .пя копирования на FTP-сервер.

Как мы уже отмечали, FTP-протокол серьезно загружает каналы, соединяющие вас с другими сетями, по этой причине в нашей программе любое действие с файлами на FTP-сервере будет предваряться открытием соедине-ния и закрытием сразу по завершении указанного действия.

На приведенной схеме штрих-пунктирной линией обозначен модуль, не рассматриваемый в описываемых ниже кодах.

В данной главе уже приводился пример считывания данных из текстового файла, точно таким же образом мы считываем необходимые данные из файла RegistrationFTP.txt, где изначально выбираются сведения из первой записи. Напомним, что первой записью является перечень полей для второй и следующих строк текстового файла (листинг 18.5).

Листинг 18.5. Текстовый файл RegistrationFTP.txt

"ID", "LocalDir", "Server",

"UserName","Password"

"1", "С:\SourceFTP\IPWeb\",

"IPWeb","IUSR IPWEB","****"

"2", "С: \SourceFTP\Allaire\",

"ftp.allaire.com","Anonymous",

"Ruben@MyMail"

"3","C:\SourceFTP\Allaire\",

"ftp2.allaire.com","Anonymous",

"Ruben@MyMail"

Примечание

Звездочками (*) автор скрывает собственный пароль.

В качестве следующего кода (листинг 18.6) приводится пример считывания данных для регистрации и открытия сеанса работы с РТР-сервером.

Листинг 18.6. Получение данных для регистрации и соединения, файл OpenFTP.cfm

<CFHTTP METHOD = "Get"

URL = "http://127.0.0.1/myftp/registrationftp.txt" NAME = "RegFTP">

<CFOUTPUT QUERY = "RegFTP"

MAXROWS = "1" STARTROW = "#CurIDConnect#"> <CFFTP ACTION = "Open"

CONNECTION = "FTP"

SERVER = "#Server#".

USERNAME = "#UserName#"

PASSWORD = "#Password#"

RETRYCOUNT = "3"> <CFSET LocalDir = LocalDir> </CFOUTPUT>

Здесь переменная curioconnect заранее определяется на загружаемой странице. В частности, одной из таких страниц, как это видно из схемы взаимодействия модулей, является страница MamFTP.cfm. Она же и рассматривается в качестве главной страницы всего проекта.

Что же происходит при выполнении кода MainFTP.cfm. В первую очередь анализируется наличие необходимой переменной для поиска данных, позволяющих произвести регистрацию на FTP-сервере. В случае отсутствия этой переменной ей присваивается значение по умолчанию, равное 1. Далее происходит регистрация и непосредственное установление соединения с FTP-сервером. Затем определяется текущий каталог на РТР-сервере с помощью тега <CFFTP> с действием Getcurrentoir и с указанием имени открытого соединения. Следующим шагом, используя все тот же тег <CFFTP> и то же соединение, но уже с действием ListDir, создается запрос ListLocalDir, в который помещается список файлов из текущего каталога

FTP-сервера. Надо заметить, что при выводе на экран мы ограничиваем данный список, показывая только файлы с расширением cfm без отображения подкаталогов. В левой же таблице находится список файлов, полученных в результате использования тега <CFDIRECTORY> с действием List и указанием текущего каталога с помощью переменной LocalDir, определяемой из регистрационного файла RegistrationFTP.txt. Но перед формированием таблиц с данными списками на странице MainFTP.cfm производится плановое закрытие соединения в результате использования тега <CFFTP> с действием close. Листинг страницы MainFTP.cfm представлен ниже.

Листинг 18.7. Код страницы MainFTP.cfm

<HTML>

<HEAD>

<TITLE>Main</TITLE> </HEAD>

<BODY bgcolor="<cfoutput>#Application.myBGColor#</cfoutput>">

<script type="text/javascript" language="JavaScript"

src="selectchecks. js"></script> <script>

function PutGetDelSelFile(fonn, type, curidconnect) {

idxlen = SelUnsellnv(form); var strCheck = "";

for (i=0;i<idxlen;i++) { if(ns) {

eval("var valltem = document."+form+".elements[i].checked");

if (valltem==true) { if (strCheck=="") {

eval("strCheck = document."+form+".elements[i].value"); }

else {

eval("strCheck = strCheck + ',' +

document."+form+".elements[i].value"); } } }

else (

eval("var valltem = document."+form+".elements(i).checked");

if (valltem=true) { if (strCheck=="") {

eval("strCheck = document."+form+".elements(i).value"); }

else {

eval("strCheck = strCheck + ',' +

document."+form+".elements(i).value"); } } ) }

if (strCheck == "") {

alert("For put or get it is necessary to select even one file!"}; }

else {

if (type =="Del") {

eval("window.location.href =

'deleteftp.cfm?Type="+type+"&CurIDConnect="+ curidconnect+"&NameSel="+strCheck+"'"); }

else {

eval("window.location.href =

putgetftp.cfm?Type="+type+"&CurIDConnect="+

curidconnect+"&NameSel="+strCheck+"'"); } } }

</script>

<CFIF isDefined("IDConnect")>

<CFSET CurlDConnect = IDConnect> <CFELSE>

<CFSET CurlDConnect = 1> </CFIF>

<CFINCLUDE TEMPLATE = "openftp.cfm">

<CFFTP ACTION = "GetCurrentDir"

CONNECTION = FTP>.

<CFSET CurDirFTP = cfftp.ReturnValue>

<CFFTP ACTION = "ListDir"

CONNECTION = "FTP" DIRECTORY = "#CurDirFTP#" NAME="ListCurDirFTP">

<CFINCLUDE TEMPLATE = "closeftp.cfm">

<CFDIRECTORY ACTION = "List"

DIRECTORY = "#LocalDir#" NAME = "ListLocalDir"

FILTER = "*.cfm" SORT = "name ASC">

<TABLE width="100%" cellpadding="0" cellspacing="0"> <TR><TD colspan="3" class="txt" align="right">

<CFFORM NAME = "Form" ACTION = "mainftp.cfm">

Current connect:

<CFSELECT QUERY = "RegFTP" NAME = "IDConnect" VALUE = "ID" DISPLAY = "Server" SELECTED = "#CurIDConnect#"> </CFSELECT>

<input type="Submit" value="Reconnect">

</CFFORM> </TD></TR> <TR>

<TD class="txt">Local Directory:

<input name="LocalDir" size="28" readonly="Yes"

value="<CFOUTPUT>#LocalDir#</CFOUTPUT>"></TD>

<TD></TD> <TD class="txt">FTP Directory:

<input name="CurDirFTP" size="28" readonly="Yes"

value="<CFOUTPUT>#CurDirFTP#</CFOUTPUT>"></TD> </TR>

<TR>

<TD valign="top">

<TABLE width="100%" cellpadding="2" cellspacing="4">

<TR><TD colspan="4" bgcolor="#cbccbd" height=l></TD></TR>

<TR>

<TD class="txt" width="40" align="center">Check</TD>

<TD class="txt">Name</TD>

<TD class="txt" width="50" align="center">Size</TD>

<TD class="txt" width="100" align="center">Date</TD> </TR>

<TR><TD colspan="4" bgcolor="#cbccbd" height=l></TD></TR>

<FORM method="post" name="forml"> <CFOUTPUT QUERY="ListLocalDir">

<TR>

<TD class="txt" width="40" align="center">

<input type="checkbox" value="#Name#" name="#Name#"> </TD>

<TD class="txt">#Name#</TD>

<TD class="txt" width="50" align="right">#Size#</TD>

<TD class="txt" width="100"

align="center">#DateFormat(DateLastModified, "dd-iran-yy")# ITimeFormat(DateLastModified,"НН:mm") #</TD>

</TR>

</CFOUTPUT> </FORM>

<TR><TD colspan="4" bgcolor="#cbccbd" height=l></TD></TR>

<TR>

<TD class="txt" colspan="4" height="25">

<a href="javascript:SelectAll('forml');"

class="txtlink">Select All</a>&nbsp;,


<a href="javascript:UnselectAll('forml');"

class="txtlink">Unselect All</a>&nbsp;,

<a href = " j a vea script: Invert Checks ( ' forml ' ) ; "

class="txtlink">Invert Checks</a> </TD> </TR>

</TABLE> </TD>

<TD width="30" align="center" class="txt">

<input type="Button" value="->>"

onClick="javascript:PutGetDelSelFile('forml', 'Put',

'<CFOUTPUT>#CurIDConneet#</CFOUTPUT>');"> <br><br>

<input type="Button" value="<<-"

onClick="javascript:PutGetDelSelFile('form2', 'Get',

'<CFOUTPUT>#CurIDConnect#</CFOUTPUT>');"> </TD>

<TD valign="top">

<TABLE width="100%"

cellpadding="2", cellspacing="4">

<TRXTD colspan="4"

bgcolor="#cbccbd" height=l></TD></TR>

<TR>

<TD class="txt" width="40"

align="center">Check</TD>

<TD class="txt">Name</TD>

<TD class="txt" width="50"

align="center">Size</TD>

<TD class="txt" width="40"

align="center">Control</TD> </TR>

<TR><TD colspan="4" bgcolor="tcbccbd"

height=1></TD></TR>

<FORM method="post" name="form2">

<CFOUTPUT QUERY="ListCurDirFTP">

<CFIF IsDirectory eq "No"

AND Right(Name, 4) eq ".cfm">

<TR>

<TD class="txt" width="40"

align="center">

<input type="checkbox"

name="#Name#" value="#Name#"> </TD>

<TD class="txt">lName#</TD>

<TD class="txt" width="50"

align="right">#Length#</TD>

<TD class="txt" width="40" align="center">


href="deleteftp.cfm?Name=

#Name#&CurIDConnect=#CurIDConnect#">

<IMG src="delete.gif" alt="Delete" border='0'

</TD>

</TR>

</CFIF>

</CFOUTPUT>

</FORM>

<TR><TD colspan="4" bgcolor="#cbccbd" height=l></TD></TR> <TR>

<TD class="txt" colspan="3" height="25">

<a href="javascript:SelectAll('form2');"

class="txtlink">Select All</a>&nbsp;,

<a href="javascript:UnselectAll('form2');"

class="txtlink">Unselect All</a>&nbsp;,

<a href="javascript:InvertChecks('form2'};"

class="txtlink">Invert Checks</a> </TD>

<TD align="center">

<a href="javascript:PutGetDelSelFile('form2', 'Del', '

<CFOUTPUT>#CurIDConnect#

</CFOUTPUT>');">

<IMG src="deletesel.gif" border='0'

alt="Delete Selected"></a> </TD> </TR>

</TABLE> </TD> </TR> </TABLE>

</BODY> </HTML>

Как вы, наверное, уже заметили, в данную страницу включен файл JavaScript SelectChecks.js (листинг 18.8), содержащий дополнительные функции, необходимые для правильного выделения флажков (checks) с помощью инструментов группового выделения. (Select All (Выделить все), Unselect АН (Снять выделение), Invert Checks (Инвертировать пометку)).

Листинг 18.8. Код JavaScript SelectChecks.js

function SelUnsellnv(form) (

eval("var idxlen = document."+form+".elements.length");

return idxlen; } function SelectAll(form) {

idxlen = SelUnsellnv(form);

for (i=0; Kidxlen; i++) {

if(ns) eval("document."+form+".elements[i].checked = true");

else eval("document."+form+".elements(i).checked = true");

} } function UnselectAll(form) {

idxlen - SelUnsellnv(form);

for (i=0; Kidxlen; i++) {

if(ns) eval("document."+form+".elements[i].checked = false");

else eval("document."+form+".elements(i).checked = false");

} } function InvertChecks(form) {

idxlen = SelUnsellnv(form);

for (i=0; Kidxlen; i++) {

if(ns) {

eval("var valltem = document."+form+".element9[i] .checked") ,

if (valltem==true) {

eval("document."+form+".elements[i].checked = false"); }

else {

eval"("document."+form+".elements[i].checked = true"); } }

else {

eval("var valltem = document."+form+".elements(i).checked"),

if (valltem==true) {

eval("document."+form+".elements(i).checked = false"); }

else {

eval-("document."+form+".elements(i).checked = true");

} } } }

Во все страницы, так или иначе использующие FTP-соединение, включена страница CloseFTP.cfm, где приведен код для закрытия текущего соединения с FTP-сервером. Листинг страницы CloseFTP.cfm представлен ниже.

Листинг 18.9. Закрытие соединения. Файл CloseFTP.cfm

<CFFTP ACTION = "Close"

CONNECTION = "FTP">

Следующая описываемая нами страница PutGetFTP.cfm (листинг 18.10) позволяет отправлять (put) и получать (get) файлы в зависимости от значения переменной туре, которое определяется одной из ссылок на главной странице приложения MainFTP.cfm.

Листинг 18.10. Отправление и получение файлов. Файл PutGetFTP.cfm

<HTML> <HEAD>

<TITLE>PutGet</TITLE> </HEAD>

<BODY bgcolor="<cfoutput>#Application.myBGColor#</cfoutput>">

<CFIF isDefinedf"URL.Type") AND isDefined("URL.CurIDConnect")

AND isDefined("URL.NameSel")> <CFINCLUDE TEMPLATE = "openftp.cfm">

<CFSWITCH EXPRESSION=#Type#> <CFCASE VALUE="Put">

<CFLOOP INDEX = "File" LIST="#URL.NameSel#" >

<CFSET FullPath = LocalDir & File>

<CFFTP ACTION = "PutFile" CONNECTION = "FTP"

LOCALFILE = "#FullPath#" REMOTEFILE = "#File#" TRANSFERMODE = "Auto">

</CFLOOP> </CFCASE> <CFCASE VALUE="Get">

<CFLOOP INDEX = "File" LIST="#URL.NameSelf" >

<CFSET FullPath = LocalDir & File>

<CFFTP ACTION = "GetFile" CONNECTION = "FTP" LOCALFILE = "#FullPath#" REMDTEFILE = "#File#" TPANSFERMODE - "Auto">

<I/CFLООР> </CFCASE> </CFSWITCH> <CFINCLUDE TEMPLATE = "closeftp.cfm">

</CFIF>

<META HTTP-EQUIV="Refresh"

CONTENT="0;URL=mainftp.cfm?CurID

Connect=<CFOUTPUT>#CurIDConnect#

</CFODTPUT>">

</BODY> </HTML>

И последней описываемой в этой главе является страница DeleteFTP.cfm (листинг 18.11). Уже судя по названию, можно догадаться о ее предназначении. Именно эта страница позволяет нам удалять файлы, находящиеся на FTP-сервере, причем как по отдельности, так и списком, заранее определенным все на той же главной странице приложения MainFTP.cfm.

Листинг 18.11. Удаление файлов на FTP-сервере. Файл DeleteFTP.cfm

<HTML> <HEAD>

<TITLE>Delete</TITLE> </HEAD>

<BODY bgcolor="<cfoutput>#Application.myBGColor#</cfoutput>">

<CFIF isDefined("URL.CurIDConnect") AND (isDefinedC'URL.Name")

OR isDefined("URL.NameSel"))>

<CFINCLUDE TEMPLATE = "openftp.cfm">

<CFIF isDefined("URL.Name")>

<CFFTP ACTION = "Remove" CONNECTION = "FTP" ITEM = "#URL.Name#">

<CFELSE>

<CFLOOP INDEX = "File" LIST="#URL.NameSel#" >

<CFFTP ACTION = "Remove" CONNECTION = "FTP" ITEM = "#File#">

</CFLOOP> </CFIF> <CFINCLUDE TEMPLATE = "closeftp.cfm">

</CFIF>

<META HTTP-EQUIV="Refresh"

CONTENT="0;URL=mainftp.cfm?

CurIDConnect=<CFOUTPUT>#CurIDConnect#

</CFOUTPUT>">

</BODY> </HTML>

Мы здесь не описываем конфигурационный файл (Application.cfm) для данного приложения в силу того, что он очень схож с конфигурационным файлом для реализации почтовой службы проекта "MyMail", представленного в приложении 2. Впрочем, это также касается вспомогательных файлов, таких как main.js, main.css и ie.css. Мы не без оснований назвали представленное нами приложение "упрощенным" FTP-клиентом. Это приложение действительно слишком упрощено. Однако, все в ваших руках!

Резюме

В этой главе мы уделили большое внимание таким популярным протоколам, как HTTP и FTP. Что же касается упомянутого протокола LDAP (Lightweight Directory Access Protocol, упрощенный протокол доступа к каталогам), то он является средством для выполнения основных функций управления сетевой инфраструктурой. Это способствует созданию единого, общего для всей сети, каталога, способного содержать все приложения, сетевые службы и инфраструктуру сети. Централизованные каталоги обеспечат единую стратегию управления сетью, позволяющую устанавливать критерии, в соответствии с которыми будет осуществляться управление сетевой инфраструктурой (например, параметры, задающие время отклика на запрос, или методы аутентификации различных категорий пользователей). Каталог при этом помогает придерживаться заданных критериев управления сетью в масштабах предприятия. В качестве средства для доступа к LDAP-серверу в ColdFusion применяется тег <CFLDAP>. Однако эту тему мы хотим предложить вам изучить самостоятельно.

Подведем итог. В данной главе мы познакомились с CFML-тегами <CFHTTP>, <CFHTTPPARAM> И <CFFTP>.